iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 26

Day 26: 有點小雞肋的 PDF 產生器 - wicked_pdf

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位 RoR 工程師,斜槓鼓手與行銷顧問。
每日一套件第 26 天,跟著我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!

Day 26: wicked_pdf

今天要介紹的是 wicked_pdf 這個套件,是一個可以將頁面轉換為 pdf 檔的套件。
要使用 wicked_pdf ,也要一起安裝 wkhtmltopdf-binary 這個套件,而且是必要的。因為 wicked_pdf 其實是基於 wkhtmltopdf 的 command line tools 將 HTML 轉成 pdf 的。

安裝與使用方式:

首先,安裝兩個套件。

$ bundle add wicked_pdf
$ bundle add wkhtmltopdf-binary
$ rails g wicked_pdf

會產生 config/initializers/wicked_pdf.rb 這個設定檔。
這個設定檔有一個重要的用處,就是要描述你的 wkhtmltopdf 在哪裏。

可以藉由 which 指令來找尋你安裝的位置,預設是 /usr/local/bin/wkhtmltopdf,但這因人而異
我的位置是在 /Users/weber/.rvm/gems/ruby-3.2.2/bin/wkhtmltopdf 所以我就要換掉。

which wkhtmltopdf

config/initializers/wicked_pdf.rb

WickedPdf.config = {
  exe_path: '/Users/weber/.rvm/gems/ruby-3.2.2/bin/wkhtmltopdf' #請根據你的位置調整
}

或者在 config/application.rb 裡設定也行

config.wicked_pdf = {
      exe_path: '/Users/weber/.rvm/gems/ruby-3.2.2/bin/wkhtmltopdf' #請根據你的位置調整
    }

接著在你要使用的 controller 中編寫,好比說我採用 pages#index :

def index
    respond_to do |format|
      format.html
      format.pdf do
        render pdf: "file_name"
      end
    end
  end

render pdf: 這塊,有許多種寫法,等等回頭再談。
接著,依照我剛寫的controller,我需要產生兩個 format, HTML 跟 pdf
所以我在 pages 的 view 之中創造兩個檔案,index.html.erb 以及 index.pdf.erb

這裡我沿用之前 Nokogiri 的專案,天瓏書局 - 近30天中文熱門暢銷 的頁面。
我在 index.html.erb view 中多寫入一個 a tag 按鈕

<%= link_to '下載 PDF', root_path(format: :pdf) %>

另外 index.pdf.erb 重寫,並加入

<%= wicked_pdf_stylesheet_link_tag "pdf" -%>
<%= wicked_pdf_javascript_include_tag "number_pages" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Fun_Nokogiri</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= wicked_pdf_stylesheet_link_tag "pdf" -%>
    <%= wicked_pdf_javascript_include_tag "number_pages" %>
  </head>

  <body onload="number_pages">
    <div id="header">
      <%= wicked_pdf_image_tag 'mysite.jpg' %>
    </div>
    <div id="content">
      <%= yield %>
    </div>
  </body>
</html>

這裡都準備好了,再回頭講剛剛 controller 的 render 那塊,我是寫做:

render pdf: "file_name", template: "pages/index", formats: [:html], encoding: 'UTF-8' , dpi: 72

應該可以理解吧,我有點懶得解釋了
白話表示:請 PDF 用 "pages/index" 當 template,採:html formats,編碼 UTF-8,dpi 72

恩? 有解釋跟沒解釋一樣

按鈕點下去,就看到這樣了

噹啷~~成功了!
有任何問題請隨時發問!我們明天見!


上一篇
Day 25: 麝香葡萄好好吃 之 RESTful API Framework - Grape
下一篇
Day 27: 小巧好用的自動化物件工廠 - Factory_Bot
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言